Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / frontend / nomadFavouritesLayoutStore.test.js

Displaying Raw • Download


tests/frontend/nomadFavouritesLayoutStore.test.js bce42bcdce0e7d2c6d78228e864a4cd1d974cc82 (bce42bcd) Text, 9.42 KB

Tff7b72import Tb4b4b4{ Te6edf3afterEachTb4b4b4, Te6edf3beforeEachTb4b4b4, Te6edf3describeTb4b4b4, Te6edf3expectTb4b4b4, Te6edf3itTb4b4b4, Te6edf3vi Tb4b4b4} Tff7b72from Ta5d6ff"vitest"Tb4b4b4;
Tff7b72import Tb4b4b4{
Te6edf3MAX_HASHES_PER_SECTIONTb4b4b4,
Te6edf3MAX_SECTION_NAME_LENTb4b4b4,
Te6edf3MAX_SECTIONSTb4b4b4,
Te6edf3MAX_TOTAL_HASHESTb4b4b4,
Te6edf3_resetNomadFavouritesLayoutSaveStateForTestsTb4b4b4,
Te6edf3loadNomadFavouritesLayoutTb4b4b4,
Te6edf3normalizeNomadFavouritesLayoutTb4b4b4,
Te6edf3saveNomadFavouritesLayoutTb4b4b4,
Te6edf3serializeNomadFavouritesLayoutTb4b4b4,
Tb4b4b4} Tff7b72from Ta5d6ff"@/js/nomadFavouritesLayoutStore.js"Tb4b4b4;

Te6edf3describeTb4b4b4(Ta5d6ff"nomadFavouritesLayoutStore"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3beforeEachTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3_resetNomadFavouritesLayoutSaveStateForTestsTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3viTb4b4b4.Te6edf3stubGlobalTb4b4b4(Ta5d6ff"localStorage"Tb4b4b4, Tb4b4b4{
Te6edf3getItemTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3setItemTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3removeItemTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3afterEachTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3viTb4b4b4.Te6edf3unstubAllGlobalsTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3_resetNomadFavouritesLayoutSaveStateForTestsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"normalizes layout shape"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3normalized Tff7b72= Te6edf3normalizeNomadFavouritesLayoutTb4b4b4(Tb4b4b4{
Te6edf3sectionsTff7b72: Tb4b4b4[
Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"default"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"Favourites"Tb4b4b4, Te6edf3collapsedTff7b72: Tff7b72false Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"custom"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"Custom"Tb4b4b4, Te6edf3collapsedTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"default"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"dup" Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3sectionOrderTff7b72: Tb4b4b4[Ta5d6ff"custom"Tb4b4b4, Ta5d6ff"missing"Tb4b4b4]Tb4b4b4,
Te6edf3favouritesBySectionTff7b72: Tb4b4b4{
Te6edf3customTff7b72: Tb4b4b4[Ta5d6ff"abc"Tb4b4b4, T79c0ff1Tb4b4b4]Tb4b4b4,
Te6edf3orphanTff7b72: Tb4b4b4[Ta5d6ff"x"Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3sectionsTb4b4b4)Tb4b4b4.Te6edf3toHaveLengthTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3sectionOrderTb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4[Ta5d6ff"custom"Tb4b4b4, Ta5d6ff"default"Tb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3favouritesBySectionTb4b4b4.Te6edf3customTb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4[Ta5d6ff"abc"Tb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3favouritesBySectionTb4b4b4.Tff7b72defaultTb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3favouritesBySectionTb4b4b4.Te6edf3orphanTb4b4b4)Tb4b4b4.Te6edf3toBeUndefinedTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"rejects arrays and prototype pollution keys"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3normalizeNomadFavouritesLayoutTb4b4b4(Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeNullTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3normalized Tff7b72= Te6edf3normalizeNomadFavouritesLayoutTb4b4b4(Tb4b4b4{
Te6edf3sectionsTff7b72: Tb4b4b4[
Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"__proto__"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"bad" Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"constructor"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"bad" Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"ok"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"Good" Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3favouritesBySectionTff7b72: Tb4b4b4{
Te6edf3__proto__Tff7b72: Tb4b4b4[Ta5d6ff"a"Tb4b4b4]Tb4b4b4,
Te6edf3okTff7b72: Tb4b4b4[Ta5d6ff"b"Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3sectionsTb4b4b4.Te6edf3mapTb4b4b4(Tb4b4b4(Te6edf3sTb4b4b4) Tb4b4b4=> Te6edf3sTb4b4b4.Te6edf3idTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4[Ta5d6ff"ok"Tb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3favouritesBySectionTb4b4b4.Te6edf3okTb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4[Ta5d6ff"b"Tb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tffa657ObjectTb4b4b4.Te6edf3prototypeTb4b4b4.Te6edf3hasOwnPropertyTb4b4b4.Te6edf3callTb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3favouritesBySectionTb4b4b4, Ta5d6ff"__proto__"Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"enforces size caps"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3sections Tff7b72= Tffa657ArrayTb4b4b4.Tff7b72fromTb4b4b4(Tb4b4b4{ Te6edf3lengthTff7b72: Te6edf3MAX_SECTIONS Tff7b72+ T79c0ff8 Tb4b4b4}Tb4b4b4, Tb4b4b4(Te6edf3_Tb4b4b4, Te6edf3iTb4b4b4) Tb4b4b4=> Tb4b4b4(Tb4b4b4{
Te6edf3idTff7b72: Ta5d6ff`Ta5d6ffsTffd700${Te6edf3iTffd700}Ta5d6ff`Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"n"Tb4b4b4.Te6edf3repeatTb4b4b4(Te6edf3MAX_SECTION_NAME_LEN Tff7b72+ T79c0ff20Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3hashes Tff7b72= Tffa657ArrayTb4b4b4.Tff7b72fromTb4b4b4(Tb4b4b4{ Te6edf3lengthTff7b72: Te6edf3MAX_HASHES_PER_SECTION Tff7b72+ T79c0ff20 Tb4b4b4}Tb4b4b4, Tb4b4b4(Te6edf3_Tb4b4b4, Te6edf3iTb4b4b4) Tb4b4b4=> Te6edf3iTb4b4b4.Te6edf3toStringTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4.Te6edf3padStartTb4b4b4(T79c0ff32Tb4b4b4, Ta5d6ff"0"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3normalized Tff7b72= Te6edf3normalizeNomadFavouritesLayoutTb4b4b4(Tb4b4b4{
Te6edf3sectionsTb4b4b4,
Te6edf3sectionOrderTff7b72: Te6edf3sectionsTb4b4b4.Te6edf3mapTb4b4b4(Tb4b4b4(Te6edf3sTb4b4b4) Tb4b4b4=> Te6edf3sTb4b4b4.Te6edf3idTb4b4b4)Tb4b4b4,
Te6edf3favouritesBySectionTff7b72: Tb4b4b4{ Te6edf3s0Tff7b72: Te6edf3hashes Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3sectionsTb4b4b4)Tb4b4b4.Te6edf3toHaveLengthTb4b4b4(Te6edf3MAX_SECTIONSTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3sectionsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3nameTb4b4b4)Tb4b4b4.Te6edf3toHaveLengthTb4b4b4(Te6edf3MAX_SECTION_NAME_LENTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3favouritesBySectionTb4b4b4.Te6edf3s0Tb4b4b4)Tb4b4b4.Te6edf3toHaveLengthTb4b4b4(Te6edf3MAX_HASHES_PER_SECTIONTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"enforces total hash cap across sections"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3sections Tff7b72= Tb4b4b4[
Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"a"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"A" Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"b"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"B" Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"c"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"C" Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"d"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"D" Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3per Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3MAX_TOTAL_HASHES Tff7b72/ T79c0ff4Tb4b4b4) Tff7b72+ T79c0ff20Tb4b4b4;
Tff7b72const Te6edf3normalized Tff7b72= Te6edf3normalizeNomadFavouritesLayoutTb4b4b4(Tb4b4b4{
Te6edf3sectionsTb4b4b4,
Te6edf3favouritesBySectionTff7b72: Tffa657ObjectTb4b4b4.Te6edf3fromEntriesTb4b4b4(
Te6edf3sectionsTb4b4b4.Te6edf3mapTb4b4b4(Tb4b4b4(Te6edf3sTb4b4b4) Tb4b4b4=> Tb4b4b4[
Te6edf3sTb4b4b4.Te6edf3idTb4b4b4,
Tffa657ArrayTb4b4b4.Tff7b72fromTb4b4b4(Tb4b4b4{ Te6edf3lengthTff7b72: Te6edf3per Tb4b4b4}Tb4b4b4, Tb4b4b4(Te6edf3_Tb4b4b4, Te6edf3iTb4b4b4) Tb4b4b4=> Ta5d6ff`Tffd700${Te6edf3sTb4b4b4.Te6edf3idTffd700}Tffd700${Te6edf3iTffd700}Ta5d6ff`Tb4b4b4.Te6edf3padEndTb4b4b4(T79c0ff32Tb4b4b4, Ta5d6ff"0"Tb4b4b4)Tb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff32Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4]Tb4b4b4)
Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3total Tff7b72= Tffa657ObjectTb4b4b4.Te6edf3valuesTb4b4b4(Te6edf3normalizedTb4b4b4.Te6edf3favouritesBySectionTb4b4b4)Tb4b4b4.Te6edf3reduceTb4b4b4(Tb4b4b4(Te6edf3nTb4b4b4, Te6edf3arrTb4b4b4) Tb4b4b4=> Te6edf3n Tff7b72+ Te6edf3arrTb4b4b4.Te6edf3lengthTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3totalTb4b4b4)Tb4b4b4.Te6edf3toBeLessThanOrEqualTb4b4b4(Te6edf3MAX_TOTAL_HASHESTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"loads remote layout and caches locally"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3layout Tff7b72= Tb4b4b4{
Te6edf3sectionsTff7b72: Tb4b4b4[Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"default"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"Favourites"Tb4b4b4, Te6edf3collapsedTff7b72: Tff7b72false Tb4b4b4}Tb4b4b4]Tb4b4b4,
Te6edf3sectionOrderTff7b72: Tb4b4b4[Ta5d6ff"default"Tb4b4b4]Tb4b4b4,
Te6edf3favouritesBySectionTff7b72: Tb4b4b4{ Tff7b72defaultTff7b72: Tb4b4b4[Ta5d6ff"a"Tb4b4b4] Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3api Tff7b72= Tb4b4b4{
Te6edf3getTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mockResolvedValueTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3layout Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3putTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3loaded Tff7b72= Tff7b72await Te6edf3loadNomadFavouritesLayoutTb4b4b4(Te6edf3apiTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3loadedTb4b4b4.Te6edf3favouritesBySectionTb4b4b4.Tff7b72defaultTb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4[Ta5d6ff"a"Tb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3localStorageTb4b4b4.Te6edf3setItemTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3apiTb4b4b4.Te6edf3putTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toHaveBeenCalledTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"migrates localStorage layout to the API when remote is empty"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3layout Tff7b72= Tb4b4b4{
Te6edf3sectionsTff7b72: Tb4b4b4[Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"default"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"Favourites"Tb4b4b4, Te6edf3collapsedTff7b72: Tff7b72false Tb4b4b4}Tb4b4b4]Tb4b4b4,
Te6edf3sectionOrderTff7b72: Tb4b4b4[Ta5d6ff"default"Tb4b4b4]Tb4b4b4,
Te6edf3favouritesBySectionTff7b72: Tb4b4b4{ Tff7b72defaultTff7b72: Tb4b4b4[Ta5d6ff"migrated"Tb4b4b4] Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Te6edf3localStorageTb4b4b4.Te6edf3getItemTb4b4b4.Te6edf3mockImplementationTb4b4b4(Tb4b4b4(Te6edf3keyTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3key Tff7b72=== Ta5d6ff"meshchat.nomadnet.favourites.layout"Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Te6edf3layoutTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3api Tff7b72= Tb4b4b4{
Te6edf3getTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mockResolvedValueTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3layoutTff7b72: Tff7b72null Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3putTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mockResolvedValueTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3layout Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3loaded Tff7b72= Tff7b72await Te6edf3loadNomadFavouritesLayoutTb4b4b4(Te6edf3apiTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3loadedTb4b4b4.Te6edf3favouritesBySectionTb4b4b4.Tff7b72defaultTb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4[Ta5d6ff"migrated"Tb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3apiTb4b4b4.Te6edf3putTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledWithTb4b4b4(Ta5d6ff"/api/v1/favourites/layout"Tb4b4b4, Tb4b4b4{ Te6edf3layout Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"skips no-op saves after an identical layout was persisted"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3layout Tff7b72= Tb4b4b4{
Te6edf3sectionsTff7b72: Tb4b4b4[Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"default"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"Favourites"Tb4b4b4, Te6edf3collapsedTff7b72: Tff7b72false Tb4b4b4}Tb4b4b4]Tb4b4b4,
Te6edf3sectionOrderTff7b72: Tb4b4b4[Ta5d6ff"default"Tb4b4b4]Tb4b4b4,
Te6edf3favouritesBySectionTff7b72: Tb4b4b4{ Tff7b72defaultTff7b72: Tb4b4b4[Tb4b4b4] Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3api Tff7b72= Tb4b4b4{
Te6edf3putTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mockResolvedValueTb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3layout Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72await Te6edf3saveNomadFavouritesLayoutTb4b4b4(Te6edf3apiTb4b4b4, Te6edf3layoutTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3saveNomadFavouritesLayoutTb4b4b4(Te6edf3apiTb4b4b4, Te6edf3layoutTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3apiTb4b4b4.Te6edf3putTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledTimesTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3serializeNomadFavouritesLayoutTb4b4b4(Te6edf3layoutTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"default"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"coalesces concurrent saves into one PUT of the latest layout"Tb4b4b4, Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3resolvers Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3api Tff7b72= Tb4b4b4{
Te6edf3putTff7b72: Te6edf3viTb4b4b4.Te6edf3fnTb4b4b4(
Tb4b4b4(Tb4b4b4) Tb4b4b4=>
Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3resolversTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3resolveTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)
Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3first Tff7b72= Tb4b4b4{
Te6edf3sectionsTff7b72: Tb4b4b4[Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"default"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"Favourites"Tb4b4b4, Te6edf3collapsedTff7b72: Tff7b72false Tb4b4b4}Tb4b4b4]Tb4b4b4,
Te6edf3sectionOrderTff7b72: Tb4b4b4[Ta5d6ff"default"Tb4b4b4]Tb4b4b4,
Te6edf3favouritesBySectionTff7b72: Tb4b4b4{ Tff7b72defaultTff7b72: Tb4b4b4[Ta5d6ff"one"Tb4b4b4] Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3second Tff7b72= Tb4b4b4{
Te6edf3sectionsTff7b72: Tb4b4b4[Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"default"Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff"Favourites"Tb4b4b4, Te6edf3collapsedTff7b72: Tff7b72false Tb4b4b4}Tb4b4b4]Tb4b4b4,
Te6edf3sectionOrderTff7b72: Tb4b4b4[Ta5d6ff"default"Tb4b4b4]Tb4b4b4,
Te6edf3favouritesBySectionTff7b72: Tb4b4b4{ Tff7b72defaultTff7b72: Tb4b4b4[Ta5d6ff"two"Tb4b4b4] Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3p1 Tff7b72= Te6edf3saveNomadFavouritesLayoutTb4b4b4(Te6edf3apiTb4b4b4, Te6edf3firstTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3p2 Tff7b72= Te6edf3saveNomadFavouritesLayoutTb4b4b4(Te6edf3apiTb4b4b4, Te6edf3secondTb4b4b4)Tb4b4b4;
Tff7b72await Tffa657PromiseTb4b4b4.Te6edf3resolveTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3apiTb4b4b4.Te6edf3putTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledTimesTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3apiTb4b4b4.Te6edf3putTb4b4b4.Te6edf3mockTb4b4b4.Te6edf3callsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3layoutTb4b4b4.Te6edf3favouritesBySectionTb4b4b4.Tff7b72defaultTb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4[Ta5d6ff"one"Tb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3resolversTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3layoutTff7b72: Te6edf3first Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3viTb4b4b4.Te6edf3waitForTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3expectTb4b4b4(Te6edf3apiTb4b4b4.Te6edf3putTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledTimesTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3apiTb4b4b4.Te6edf3putTb4b4b4.Te6edf3mockTb4b4b4.Te6edf3callsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3layoutTb4b4b4.Te6edf3favouritesBySectionTb4b4b4.Tff7b72defaultTb4b4b4)Tb4b4b4.Te6edf3toEqualTb4b4b4(Tb4b4b4[Ta5d6ff"two"Tb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3resolversTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4(Tb4b4b4{ Te6edf3dataTff7b72: Tb4b4b4{ Te6edf3layoutTff7b72: Te6edf3second Tb4b4b4} Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Tffa657PromiseTb4b4b4.Te6edf3allTb4b4b4(Tb4b4b4[Te6edf3p1Tb4b4b4, Te6edf3p2Tb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3apiTb4b4b4.Te6edf3putTb4b4b4)Tb4b4b4.Te6edf3toHaveBeenCalledTimesTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Te6edf3itTb4b4b4(Ta5d6ff"fuzzing: normalize never throws on random payloads"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3samples Tff7b72= Tb4b4b4[
Tff7b72nullTb4b4b4,
Tff7b72undefinedTb4b4b4,
T79c0ff0Tb4b4b4,
T79c0ff1Tb4b4b4,
Tff7b72trueTb4b4b4,
Tff7b72falseTb4b4b4,
Ta5d6ff""Tb4b4b4,
Ta5d6ff"layout"Tb4b4b4,
Tb4b4b4[Tb4b4b4]Tb4b4b4,
Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3sectionsTff7b72: Tff7b72null Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3sectionsTff7b72: Ta5d6ff"x" Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3sectionsTff7b72: Tb4b4b4[Tb4b4b4{ Te6edf3idTff7b72: T79c0ff1 Tb4b4b4}Tb4b4b4] Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3sectionsTff7b72: Tb4b4b4[Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"a"Tb4b4b4, Te6edf3nameTff7b72: Tb4b4b4{ Te6edf3nestedTff7b72: Tff7b72true Tb4b4b4} Tb4b4b4}Tb4b4b4]Tb4b4b4, Te6edf3favouritesBySectionTff7b72: Tb4b4b4[Tb4b4b4] Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3sectionsTff7b72: Tb4b4b4[Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"a" Tb4b4b4}Tb4b4b4]Tb4b4b4, Te6edf3favouritesBySectionTff7b72: Tb4b4b4{ Te6edf3aTff7b72: Ta5d6ff"not-array" Tb4b4b4} Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3sectionsTff7b72: Tb4b4b4[Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff"a" Tb4b4b4}Tb4b4b4]Tb4b4b4, Te6edf3favouritesBySectionTff7b72: Tb4b4b4{ Te6edf3aTff7b72: Tb4b4b4[Tff7b72nullTb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4, Ta5d6ff"ok"Tb4b4b4] Tb4b4b4} Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff200Tb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Te6edf3samplesTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3sectionsTff7b72: Tffa657ArrayTb4b4b4.Tff7b72fromTb4b4b4(Tb4b4b4{ Te6edf3lengthTff7b72: Tb4b4b4(Te6edf3i Tff7b72% T79c0ff10Tb4b4b4) Tff7b72+ T79c0ff1 Tb4b4b4}Tb4b4b4, Tb4b4b4(Te6edf3_Tb4b4b4, Te6edf3jTb4b4b4) Tb4b4b4=> Tb4b4b4(Tb4b4b4{
Te6edf3idTff7b72: Te6edf3i Tff7b72% T79c0ff7 Tff7b72=== T79c0ff0 Tff7b72? Ta5d6ff`Ta5d6ff__proto__Ta5d6ff` Tff7b72: Ta5d6ff`Ta5d6ffid-Tffd700${Te6edf3iTffd700}Ta5d6ff-Tffd700${Te6edf3jTffd700}Ta5d6ff`Tb4b4b4,
Te6edf3nameTff7b72: Tffa657StringTb4b4b4.Te6edf3fromCharCodeTb4b4b4(T79c0ff0x20 Tff7b72+ Tb4b4b4(Tb4b4b4(Te6edf3i Tff7b72+ Te6edf3jTb4b4b4) Tff7b72% T79c0ff90Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3repeatTb4b4b4(Tb4b4b4(Te6edf3i Tff7b72% T79c0ff40Tb4b4b4) Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4,
Te6edf3collapsedTff7b72: Te6edf3i Tff7b72% T79c0ff2 Tff7b72=== T79c0ff0Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3sectionOrderTff7b72: Tb4b4b4[Ta5d6ff`Ta5d6ffid-Tffd700${Te6edf3iTffd700}Ta5d6ff-0Ta5d6ff`Tb4b4b4, Ta5d6ff"missing"Tb4b4b4, Tff7b72nullTb4b4b4, T79c0ff12Tb4b4b4]Tb4b4b4,
Te6edf3favouritesBySectionTff7b72: Tb4b4b4{
Tb4b4b4[Ta5d6ff`Ta5d6ffid-Tffd700${Te6edf3iTffd700}Ta5d6ff-0Ta5d6ff`Tb4b4b4]Tff7b72: Tffa657ArrayTb4b4b4.Tff7b72fromTb4b4b4(Tb4b4b4{ Te6edf3lengthTff7b72: Tb4b4b4(Te6edf3i Tff7b72% T79c0ff15Tb4b4b4) Tff7b72+ T79c0ff1 Tb4b4b4}Tb4b4b4, Tb4b4b4(Te6edf3_Tb4b4b4, Te6edf3kTb4b4b4) Tb4b4b4=>
Te6edf3k Tff7b72% T79c0ff5 Tff7b72=== T79c0ff0 Tff7b72? Te6edf3k Tff7b72: Ta5d6ff`Ta5d6ffhTffd700${Te6edf3iTffd700}Tffd700${Te6edf3kTffd700}Ta5d6ff`Tb4b4b4.Te6edf3padEndTb4b4b4(T79c0ff32Tb4b4b4, Ta5d6ff"0"Tb4b4b4)Tb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff32Tb4b4b4)
Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3sample Tff7b72of Te6edf3samplesTb4b4b4) Tb4b4b4{
Te6edf3expectTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Te6edf3normalizeNomadFavouritesLayoutTb4b4b4(Te6edf3sampleTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toThrowTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3out Tff7b72= Te6edf3normalizeNomadFavouritesLayoutTb4b4b4(Te6edf3sampleTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3outTb4b4b4) Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3outTb4b4b4.Te6edf3sectionsTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4.Te6edf3toBeGreaterThanTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3outTb4b4b4.Te6edf3sectionsTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4.Te6edf3toBeLessThanOrEqualTb4b4b4(Te6edf3MAX_SECTIONSTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3outTb4b4b4.Te6edf3sectionOrderTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Te6edf3outTb4b4b4.Te6edf3sectionsTb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────